package br.uniriotec.pssgbd.gerencia.view.controle;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.uniriotec.pssgbd.gerencia.model.bo.LocalBO;
import br.uniriotec.pssgbd.gerencia.model.entidade.Cidade;
import br.uniriotec.pssgbd.gerencia.model.entidade.Local;
import br.uniriotec.pssgbd.gerencia.model.entidade.Bairro;
import br.uniriotec.pssgbd.gerencia.model.entidade.Estado;
/**
 * Servlet implementation class LocalServlet
 */
public class LocalServlet extends BaseServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public LocalServlet() {
		super();
	}

	protected void incluir(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		String mensagem = null;
		try {
			RequestDispatcher rd = null;
			String nomelocal = (String) request.getParameter("nomelocal");
			Integer codCidade = Integer.valueOf(request.getParameter("cidade"));
			String tipoLocal = (String) request.getParameter("tipoLocal");
			String cep = (String) request.getParameter("cep");
			String rua = (String) request.getParameter("rua");
			Integer codBairro = Integer.valueOf(request.getParameter("bairro"));
			Integer codEstado = Integer.valueOf(request.getParameter("estado"));
			
			Local local = new Local();
			local.setCidade(recuperaCidade(request, codCidade));			
			local.setBairro(recuperaBairro(request, codBairro));
			local.setEstado(recuperaEstado(request, codEstado));
			local.setNomelocal(nomelocal);
			local.setTipoLocal(tipoLocal);
			local.setCep(cep);
			local.setRua(rua);
			
			LocalBO.getInstance().incluir(local);
			request.setAttribute("local", local);
			
			mensagem = "Local incluido com Sucesso!";
			request.setAttribute("mensagem", mensagem);
			
			rd = request.getRequestDispatcher("LocalExibir.jsp");
			rd.forward(request, response);
			
		} catch (Exception e) {
			response.sendRedirect("localErroGeral.jsp?tituloPagina=Incluir Local&mensagem=Erro na inclus�o do Local! Detalhe: " + e.getMessage());
		}
	}

	/**
	 * M�todo executado antes de apresentar a tela de inclus�o do cliente.
	 * Recupera a lista de cidades utilizada na inclus�o.
	 * 
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void antesIncluir(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		try {
			List<Cidade> listaCidades = LocalBO.getInstance().listarCidades();
			request.getSession().setAttribute("listaCidades", listaCidades);
			
			List<Bairro> listaBairro = LocalBO.getInstance().listarBairro();
			request.getSession().setAttribute("listaBairro", listaBairro);
			
			List<Estado> listaEstado = LocalBO.getInstance().listarEstado();
			request.getSession().setAttribute("listaEstado", listaEstado);
			
			RequestDispatcher rd = request
					.getRequestDispatcher("localIncluir.jsp");
			rd.forward(request, response);

		} catch (Exception e) {
			response.sendRedirect("localErroGeral.jsp?tituloPagina=Incluir Local&mensagem=Erro na inclus�o do local! Detalhe: " + e.getMessage());
		}

	}
	
	protected void listar(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		try {
			List<Local> listaLocal = LocalBO.getInstance().listar();
			request.setAttribute("listaLocal", listaLocal);

			RequestDispatcher rd = request
					.getRequestDispatcher("localListar.jsp");
			rd.forward(request, response);

		} catch (Exception e) {
			response.sendRedirect("localErroGeral.jsp?tituloPagina=Listar Local&mensagem=Erro na listagem de local! Detalhe: " + e.getMessage());
		}
	}
	
	

	/**
	 * M�todo que recupera uma cidade da sess�o atrav�s do seu id.
	 * 
	 * @param request
	 *            - cont�m o lista de cidades na sess�o
	 * @param codCidade
	 *            - c�digo da cidade que ser� localizada
	 * @return
	 */
	private Cidade recuperaCidade(HttpServletRequest request, Integer codCidade) {
		List<Cidade> listaCidades = (List<Cidade>) request.getSession()
				.getAttribute("listaCidades");
		for (Cidade cidade : listaCidades) {
			if (cidade.getCodCidade().equals(codCidade))
				return cidade;
		}

		return null;
	}
	/**
	 * M�todo que recupera uma Bairro da sess�o atrav�s do seu id.
	 * 
	 * @param request
	 *            - cont�m o lista de Bairro na sess�o
	 * @param codCidade
	 *            - c�digo da Bairro que ser� localizada
	 * @return
	 */
	private Bairro recuperaBairro(HttpServletRequest request, Integer codBairro) {
		List<Bairro> listaBairro = (List<Bairro>) request.getSession()
				.getAttribute("listaBairro");
		for (Bairro bairro : listaBairro) {
			if (bairro.getCodBairro().equals(codBairro))
				return bairro;
		}

		return null;
	}
	/**
	 * M�todo que recupera uma Estado da sess�o atrav�s do seu id.
	 * 
	 * @param request
	 *            - cont�m o lista de Estado na sess�o
	 * @param codCidade
	 *            - c�digo da Estado que ser� localizada
	 * @return
	 */
	private Estado recuperaEstado(HttpServletRequest request, Integer codEstado) {
		List<Estado> listaEstado = (List<Estado>) request.getSession()
				.getAttribute("listaEstado");
		for (Estado estado : listaEstado) {
			if (estado.getCodEstado().equals(codEstado))
				return estado;
		}

		return null;
	}
	/**
	 * Os m�todos com prefixo antes foram utilizados para reutilizar uma �nica p�gina de consulta para as funcionalidades:
	 * Consultar Cliente, Alterar Cliente e Excluir cliente.
	 * 
	 * Prepara as informa��es necess�rias para a altera��o: Consulta o cliente que ser� alterado e carrega a lista de cidades.
	 * 
	 * @param request
	 * @param response
	 * @throws Exception
	 */
	protected void antesAlterar(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		try {
			RequestDispatcher rd = null;
			String id = request.getParameter("id");
			String comando = request.getParameter("comando");
			
			if (id != null) {
				
				Local local = LocalBO.getInstance().consultar(
						Long.valueOf(id));
				request.setAttribute("local", local);
				
				List<Cidade> listaCidades = LocalBO.getInstance().listarCidades();
				request.getSession().setAttribute("listaCidades", listaCidades);
				
				List<Bairro> listaBairro = LocalBO.getInstance().listarBairro();
				request.getSession().setAttribute("listaBairro", listaBairro);
				
				List<Estado> listaEstado = LocalBO.getInstance().listarEstado();
				request.getSession().setAttribute("listaEstado", listaEstado);
				
				
				rd = request.getRequestDispatcher("localAlterar.jsp");
				
			} else {
				request.setAttribute("comando", comando);
				rd = request.getRequestDispatcher("localConsultar.jsp");
			}
			
			rd.forward(request, response);
			
		} catch (Exception e) {
			response.sendRedirect("localErroGeral.jsp?tituloPagina=Alterar Local&mensagem=Erro na altera��o do local! Detalhe: " + e.getMessage());
		}
		
	}
	
	/**
	 * Os m�todos com prefixo antes foram utilizados para reutilizar uma �nica p�gina de consulta para as funcionalidades
	 * Consultar Cliente, Alterar Cliente e Excluir cliente.
	 * 
	 * Prepara as informa��es necess�rias para exclus�o do cliente: Consulta o cliente.
	 * 
	 * @param request
	 * @param response
	 * @throws Exception
	 */
	protected void antesExcluir(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		try {
			RequestDispatcher rd = null;
			String id = request.getParameter("id");
			String comando = request.getParameter("comando");
			
			if (id != null) {
				
				Local local = LocalBO.getInstance().consultar(
						Long.valueOf(id));
				request.setAttribute("local", local);
				
				rd = request.getRequestDispatcher("localExcluir.jsp");
				
			} else {
				request.setAttribute("comando", comando);
				rd = request.getRequestDispatcher("localConsultar.jsp");
			}
			
			rd.forward(request, response);
			
		} catch (Exception e) {
			response.sendRedirect("localErroGeral.jsp?tituloPagina=Excluir Local&mensagem=Erro na exclus�o do local! Detalhe: " + e.getMessage());
		}
	}

	protected void alterar(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		try {
			RequestDispatcher rd = null;
			String id = request.getParameter("id");
			
			Local local = new Local();
			//TODO descomentar quando conectar o BD. Em mem�ria trabalhamos com o �ndice da cole��o.
			//local.setId(Long.valueOf(id));
			local.setNomelocal(request.getParameter("nomelocal"));
			local.setTipoLocal(request.getParameter("tipolocal"));
			local.setRua(request.getParameter("rua"));
			local.setCep(request.getParameter("cep"));
			
			Cidade cidade = new Cidade();
			cidade.setCodCidade(Integer.valueOf(request.getParameter("cidade")));
			cidade.setNome(request.getParameter("nomeCidade"));
			local.setCidade(cidade);
			
			Bairro bairro = new Bairro();
			bairro.setCodBairro(Integer.valueOf(request.getParameter("bairro")));
			bairro.setNome(request.getParameter("nomeBairro"));
			local.setBairro(bairro);
			
			Estado estado = new Estado();
			estado.setCodEstado(Integer.valueOf(request.getParameter("estado")));
			estado.setNome(request.getParameter("nomeEstado"));
			local.setEstado(estado);
			
			LocalBO.getInstance().alterar(local);
			request.setAttribute("local", local);
			
			String mensagem = "Local alterado com sucesso!";
			request.setAttribute("mensagem", mensagem);
			
			rd = request.getRequestDispatcher("localAlterar.jsp");
			rd.forward(request, response);
			
		} catch (Exception e) {
			response.sendRedirect("localErroGeral.jsp?tituloPagina=Alterar Local&mensagem=Erro na altera��o do local! Detalhe: " + e.getMessage());
		}
		
	}

	protected void excluir(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		try {
			RequestDispatcher rd = null;
			String id = request.getParameter("id");
			
			Local local = new Local();
			//TODO descomentar quando conectar o BD.
			//local.setId(Long.valueOf(id));
			
			LocalBO.getInstance().excluir(local);
			
			String mensagem = "Local exclu�do com sucesso!";
			request.setAttribute("mensagem", mensagem);
			
			rd = request.getRequestDispatcher("local.jsp");
			rd.forward(request, response);
			
		} catch (Exception e) {
			response.sendRedirect("localErroGeral.jsp?tituloPagina=Excluir Local&mensagem=Erro na exclus�o do local! Detalhe: " + e.getMessage());
		}
		
		
	}

	protected void consultar(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		try {
			RequestDispatcher rd = null;
			String id = request.getParameter("id");
			String comando = request.getParameter("comando");
			
			if (id != null) {
				
				Local local = LocalBO.getInstance().consultar(Long.valueOf(id));
				request.getSession().setAttribute("local", local);
				
				rd = request.getRequestDispatcher("localExibir.jsp");
				
			} else {
				request.setAttribute("comando", comando);
				rd = request.getRequestDispatcher("localConsultar.jsp");
			}
			
			rd.forward(request, response);
			
		} catch (Exception e) {
			response.sendRedirect("localErroGeral.jsp?tituloPagina=Consultar Local&mensagem=Erro na consulta de local! Detalhe: " + e.getMessage());
		}
		
		
	}
}
